var input

/**
 * fonction de construction du calendrier sous la forme d'un div.
 */

function afficherCalendrier(champId) {
	input = champId;
	element = document.getElementById(champId);
	nav = navigator.userAgent
	msie = nav.substr(nav.indexOf('MSIE')+5, 1)
	switch (msie) {
	 case '6':
		 adjustIe = 1;
	 break;
	 case '8':
		 adjustIe = 3;
	 break;
	 default: 
		 adjustIe = 0;
	 break;
	}
	
	obj = element.getBoundingClientRect()
	calendrier = document.getElementById('sbk_calendrier')
	left = obj.left+'px';
	
	if (calendrier.style.left !='-999em') {
		left = '-999em';
	}
	
	remplirCalendrier(calendrier, element.value);
	calendrier.style.top = obj.top+18+adjustIe+'px';
	calendrier.style.left = left;
}

/**
 * fonciton de remplissage du calendrier a partir de la date saisie ou a defaut de la date courante
 * @param calendrier
 * @param dateCal
 */
function remplirCalendrier(calendrier, dateCal) {
	if (dateCal == '') {
		dateCal = new Date();
		m = dateCal.getMonth()
		j = dateCal.getDate()
		y = dateCal.getFullYear()
	}
	else {
		dates = dateCal.split('/');
		y = parseInt(dates[2], 10)
		m = parseInt(dates[1], 10)-1
		j = parseInt(dates[0], 10)
		dateCal = new Date(y,m,j);
		if (isNaN(dateCal.valueOf()) == true) {
			dateCal = new Date();
			m = dateCal.getMonth()
			j = dateCal.getDate()
			y = dateCal.getFullYear()
		}
	}
	mois = genererListeMois(m);
	annee = genererListeAnnee(y);
	
	html = '<div class="calEntete"><span><a href="javascript:modifierCalendrier(-12)"><<</a></span>';
	html += '<span><a href="javascript:modifierCalendrier(-1)"><</a></span>'
	html += mois+annee+'<span><a href="javascript:modifierCalendrier(1)">></a></span>';
	html += '<span><a href="javascript:modifierCalendrier(12)">>></a></span></div>';
	html += '<table>';
	html += '<colgroup span="6" /><colgroup span="4" class="we" />';
	html += '<tr>';
	html += '<th>Sem</th><th>Lu</th><th>Ma</th><th>Me</th><th>Je</th><th>Ve</th><th>Sa</th><th>Di</th></tr><tr>';
	nbJourMois = new Date(dateCal.getFullYear(), dateCal.getMonth()+1, 0).getDate();
	jourMoisId = new Date(dateCal.getFullYear(), dateCal.getMonth(), 1).getDay();
	maDate = new Date(dateCal.getFullYear(), dateCal.getMonth(), 1);
	semId = getWeekNumber(maDate);
	html += '<th class="semaine">'+semId+'</th>';
	if (jourMoisId == 0) {
		jourMoisId = 7
	}
		jds = 1;
	for (i = 1; i<nbJourMois+jourMoisId; i++){
		maDate = new Date(dateCal.getFullYear(), dateCal.getMonth(), i)		
		if (i >= jourMoisId) {
			k = i-jourMoisId+1
			
			html += '<td><a href="javascript:selectionnerDate('+k+')">'+k+'</a></td>'
		}
		else {
			html += '<td class="vide"></td>'
		}
		if (i % 7 == 0){
			semId = getWeekNumber(maDate);
			html += '</tr><tr><th class="semaine">'+semId+'</th>'
		}
	}
	if (html.substr(-4) =='<tr>') {
		html = html.substr(0, html.length-4);
	}
	html += '</tr></table>';
	calendrier.innerHTML = html
}

/**
 * fonction pour cacher le calendrier
 * @returns {Boolean}
 */
function hideCalendar() {	
	calendrier = document.getElementById('sbk_calendrier');
	if (event.srcElement.tagName == 'A' && event.srcElement.className == 'sbk_calendrier') {
		return true;
	}
	if (calendrier != null && appartenirCalendrier(event.srcElement) == false) {
		calendrier.style.left = '-999em';
	}
} 

/**
 * fonction de génération de la lsite des années
 * @param y
 * @returns
 */
function genererListeAnnee(y) {
	annee = '<select id="sbk_year" onchange="modifierCalendrier()">';
	anneeCourante = new Date().getFullYear();
	for (i = anneeCourante-10; i<anneeCourante+10; i++) {
		selected = ''
		if (i == y) {
			selected = 'selected="selected"'
		}
		annee+='<option value="'+i+'" '+selected+'>'+i+'</option>';
	}
	annee+='</select>';
	return annee;
}

/**
 * fonction de génération de la liste des mois
 * @param m
 * @returns
 */
function genererListeMois(m) {
	var nomMois = ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun', 'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc']
	mois='<select id="sbk_month" onchange="modifierCalendrier()">'
	for (i=0; i < 12; i++) {
		selected = ''
		if (i == m) {
			selected = 'selected="selected"'
		}
		I=i+1
		if (I < 10) {
			I = '0'+I
		}
		mois+='<option value="'+I+'" '+selected+'>'+nomMois[i]+'</option>';
	}
	mois+='</select>';
	return mois
}

/**
 * fonction de modification du calendrier après changement de mois ou d'année par les listes déroulantes ou des 
 * liens de part et d'autre des listes déroulantes
 */
function modifierCalendrier() {
	calendrier = document.getElementById('sbk_calendrier')
	y = document.getElementById('sbk_year').value;
	m = document.getElementById('sbk_month').value;
	if (arguments[0] != null) {
		if (arguments[0] == 12 ) {
			y = parseInt(y, 10) + 1;
		} 
		else if (arguments[0] == -12) {
			y = parseInt(y) -1;
		}
		else {
			m = parseInt(m,10) +arguments[0];
			switch (m) {
			case 0:
				m =12; 
				y -=1;
			break;		
			case 13 :
				m =1; 
				y = parseInt(y,10)+1;
			break;
			default:
				if (m < 10) {
					m = '0'+m;
				}
			break;
			}
		}
	}
	remplirCalendrier(calendrier, '01/'+m+'/'+y);
}

/**
 * fonction qui vérifie que l'élément à l'origine de l'événement appartien au calendrier
 * @param element
 */
function appartenirCalendrier(element) {
	for (c=1; c<=5; c++) {
		if (element.tagName == 'DIV' && element.id == 'sbk_calendrier') {
			return true;
		}
		else {
			element = element.parentElement
		}
		if (element == null) {
			return false;
		}
	}
	return false;
}

/**
 * fonction qui remplit le champ du formulaire associé au calendrier avec la valeur cliquée
 * @param j
 */
function selectionnerDate(j) {
	element = document.getElementById(input);
	if (j < 10) {
		j = '0'+j; 
	}
	y = document.getElementById('sbk_year').value;
	m = document.getElementById('sbk_month').value;
	element.value = j+'/'+m+'/'+y;
	calendrier = document.getElementById('sbk_calendrier')
	calendrier.style.left = '-999em';
}

/**
 * function d'initialisation du calendrier. recherche tous les éléments du formulaire indiqués comme 
 * calendrier pour ajouter l'icone du calendrier.
 */
function chargerCalendrier() {
	genererCal = false;
	if (window.addEventListener) {
		window.addEventListener("click", hideCalendar);
    } else if (window.attachEvent) {
    	window.document.attachEvent("onclick", hideCalendar);
    }
	img = new Image()
	img.src = '../smartbok/css/images/calendar.gif';
    form = window.document.forms[0];
    for (i=0; i<form.elements.length; i++) {
    	element = form.elements[i];
    	if (element.className == 'sbk_calendrier') {
    		//element.style.backgroundColor = 'yellow';
    		lien = '<a class="sbk_calendrier" href="javascript:afficherCalendrier(\''+element.id+'\')"';
    		lien += ' title="cliquez pour afficher le calendrier"></a>';
        	element.outerHTML = element.outerHTML+lien
        	genererCal = true;
    	}
    }
    if (genererCal == true) {
    	document.body.innerHTML += '<div id="sbk_calendrier"></div>';
    	calendrier = document.getElementById('sbk_calendrier');
    	calendrier.style.left = '-999em';
    	calendrier.style.top = '0px';
    }
}


function getWeekNumber(maDate){
        var d = new Date(maDate.getFullYear(), maDate.getMonth(), maDate.getDate(), 0, 0, 0);
        var DoW = d.getDay();
        d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
        var ms = d.valueOf(); // GMT
        d.setMonth(0);
        d.setDate(4); // Thu in Week 1
        return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
};
/**
 * affectation du chargement de calendrier au chargement de la page.
 */
if (window.addEventListener) { 
	window.addEventListener("load", chargerCalendrier);
} 
else if (window.attachEvent) { 
	// IE 
	window.attachEvent("onload", chargerCalendrier);
}